package com.nineyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

import java.util.Date;

/*
1.当前类被 @SpringBootApplication 标注，被该注解标注的类是springboot项目的入口。
2.该类的main方法就是整个springboot项目的入口。
3.关于 @SpringBootApplication 注解：
	该注解被以下三个注解标注：
		@SpringBootConfiguration
		@EnableAutoConfiguration
		@ComponentScan
	也就是说 @SpringBootApplication 注解是一个复合注解，同时拥有以上三个注解的功能。
4.关于 @SpringBootConfiguration 注解：
	该注解被 @Configuration 注解标注，说明springboot项目的主入口类同时也是一个配置类，因此在springboot主入口类中
	如果使用 @Bean 注解标注方法的话，该方法的返回值对象应该会被纳入IOC容器的管理。
5. 关于 @EnableAutoConfiguration 注解：
	启用自动配置，也就是说在默认情况下，spingboot应用都会默认启用自动配置。
	自动配置有什么用？
		所谓自动配置只要启动，springboot应用就会去类路径中查找class，根据类路径中有某个类，或某些类，来自动管理bean，
		不需要我们手动配置。
		比如：springboot检测到类路径中有SqlSessionFactory，或者在application.properties文件中配置了数据源，那
		么springboot会认为项目中有mybatis框架，因此会将mybatis中相关的bean自动初始化，然后放到IOC容器中去，自动将
		这些类管理起来。
			sqlSessionFactory
			transactionManager
6. 关于 @ComponentScan 注解：
	组件扫描，代替xml配置：<context:component-scan base-packages="com.nineyang" />
	这个注解出现在springboot主入口类上，所以组件扫描默认的包是主入口程序所在的包以及该包下的所有子包。
*/
@SpringBootApplication
public class Sb303CoreAnnocationApplication {

	/*
	测试springboot程序的入口是个配置类
	*/
	@Bean
	public Date getDate(){
		return new Date();
	}

	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(Sb303CoreAnnocationApplication.class, args);
		// 测试自动配置
		Object bean = context.getBean("sqlSessionFactory");
		System.out.println(bean);
		Object bean1 = context.getBean("transactionManager");
		System.out.println(bean1);

	}

}
